package cn.tedu.service.impl;

import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.io.FilenameUtils;

import cn.tedu.dao.UserDao;
import cn.tedu.dao.impl.UserDaoImpl;
import cn.tedu.entity.Role;
import cn.tedu.entity.User;
import cn.tedu.service.UserService;
import cn.tedu.util.CommonValue;
import cn.tedu.util.ResponseUtil;
import cn.tedu.util.UUIDUtil;
import cn.tedu.vo.Page;
import cn.tedu.vo.Result;
import cn.tedu.vo.UserRole;
/**
 * UserService接口的子实现一
 * @author Administrator
 *
 */
public class UserServiceImpl implements UserService {
	private UserDao userDao=new UserDaoImpl();
	@Override
	public Result login(User user) {
		Result result=new Result();
		try {
			String id=userDao.login(user);
			if(id!=null) {
				result.setStatus(1);
				result.setMessage("登录成功!");
			}else {
				result.setStatus(0);
				result.setMessage("登录失败!!");
			}
		} catch (Exception e) {
			result.setStatus(0);
			result.setMessage("登录失败!!");
			e.printStackTrace();
		}
		return result;
	}
	@Override
	public Result findUsersByPage(int currentPage, int pageSize, String userkeyword) {
		Result result=new Result();
		try {
			Page<User> page=new Page<User>();
			page.setCurrentPage(currentPage);
			page.setPageSize(pageSize);
			userkeyword="nochar".equals(userkeyword)? "" : userkeyword;
			page.setUserkeyword(userkeyword);
			
			//查询数据库,获取指定条件的总记录数
			int totalCount=userDao.getCount(userkeyword);
			page.setTotalCount(totalCount);
			//计算总页数
			int totalPage=(totalCount/pageSize==0)? (totalCount/pageSize) :(totalCount/pageSize)+1;
			page.setTotalPage(totalPage);
			
			//计算前一页(暂时不写)
			
			//计算后一页(暂时不写)
			
			//查询数据库,获取当前页的那页数据
			List<User> users=this.getUsersByPage(currentPage,pageSize,userkeyword);
			page.setData(users);
			
			//计算bootstrap分页条中的超链接的个数(暂时不写)
			
			//如果能执行到此处,说明没有异常
			result.setStatus(1);
			result.setData(page);			
		} catch (Exception e) {
			result.setStatus(0);
			result.setMessage("没有查询到数据!!");
			e.printStackTrace();
		}
		return result;
	}
    private List<User> getUsersByPage(int currentPage,int pageSize,String userkeyword){
    	List<User> users=new ArrayList<User>();
    	try {
    		//查询数据库,获取数据库库的数据,缓存起来
    		List<UserRole> userRoles=userDao.getUserRolesByPage(currentPage,pageSize,userkeyword);
    		//System.out.println(userRoles);
    		//准备把临时缓存数据List<UserRole> userRoles 转换List<User> users中
    		for(UserRole userRole : userRoles) {
    			//如果List<User>集合为空,至少要添加一个对象
    			if(users.size()==0) {
    				User user=new User();
    				//目的:把UserRole对象中的数据拷贝给User对象
    				//借助第三方工具Commons-beanutils组件
    				//BeanUtils.copyProperties方法拷贝的时候属性数据的类型比较宽泛
    				BeanUtils.copyProperties(user, userRole);
    				//PropertyUtils.copyProperties方法开呗的数据类型必须一一对应
    				//PropertyUtils.copyProperties(user, userRole);
    				//现在是把用户的原有属性数据拷贝完毕,现在要处理user对象中的roles
    				//处理Role对象是否添加
    				String roleId=userRole.getRoleId();
    				if(roleId!=null) {
    					//当前用户至少有一个角色的
    					Role role=new Role();
    					role.setId(userRole.getRoleId());
    					role.setName(userRole.getRoleName());
    					user.getRoles().add(role);
    				}
    				users.add(user);
    			}else {
    				//说明List<User>集合的size不为零,说明集合中至少有一个用户数据
    				String user_id=userRole.getId();
    				boolean flag=false;
    				for(User user: users) {
    					if(user_id.equals(user.getId())) {
    						//说明userRole对象中的用户id跟users集合中某一个用户id相等
    						//只需要把userRole中的角色数据存储给当前用户的roles集合即可
    						Role role=new Role();
        					role.setId(userRole.getRoleId());
        					role.setName(userRole.getRoleName());
        					user.getRoles().add(role);
        					flag=true;
        					break;
    					}
    				}
    				//如果上面的循环都循环完了,都没有匹配到user_id,
    				//则把当前的userRole对象,拷贝到user对象中并添加到users集合中
    				if(!flag) {
    					//说明在循环中,循环了所有都每没有个给flag赋值为true,
    					//说明users集合中没有同名的user_id
    					User user=new User();
    					BeanUtils.copyProperties(user, userRole);
    					
    					//拷贝完毕后,还是要判断当前用户时候带有role数据
    					String roleId=userRole.getRoleId();
    					if(roleId!=null) {
        					//当前用户至少有一个角色的
        					Role role=new Role();
        					role.setId(userRole.getRoleId());
        					role.setName(userRole.getRoleName());
        					user.getRoles().add(role);
        				}
    					users.add(user);
    				}
    			}
    		}
    		
    	}catch(Exception e) {
    		e.printStackTrace();
    	}
    	return users;
    }
	@Override
	public void addUser(HttpServletRequest request, HttpServletResponse response) throws IOException {
		//此boolean值标记上传文件是否成功
		boolean flag=false;
		//创建一个User对象用户存储数据
		User user=new User();
		user.setId(UUIDUtil.getUUID());
		
		String roleId="";
				
		//要先上传文件  上传文件开始
  		try {
  			boolean isMultipart = ServletFileUpload.isMultipartContent(request);
  			if(isMultipart) {
  				DiskFileItemFactory factory = new DiskFileItemFactory();

  				ServletContext servletContext = request.getSession().getServletContext();
  				File repository = (File) servletContext.getAttribute("javax.servlet.context.tempdir");
  				factory.setRepository(repository);

  				ServletFileUpload upload = new ServletFileUpload(factory);

  				List<FileItem> items = upload.parseRequest(request);
  				System.out.println(items.size());
  				
  				Iterator<FileItem> iter = items.iterator();
  				while (iter.hasNext()) {
  				    FileItem item = iter.next();

  				    if (item.isFormField()) {
  				        //处理的是非文件域
  				    	String name = item.getFieldName();
  				        String value = new String(item.getString().getBytes("ISO-8859-1"),"UTF-8");
  				        System.out.println("非文件域-->"+name+"   "+value);
  				        if("loginName".equals(name)) {
  				        	user.setLoginName(value);
  				        }
  				        if("password".equals(name)) {
  				        	user.setPassword(value);
  				        }
  				        if("nickName".equals(name)) {
  				        	user.setNickName(value);
  				        }
  				        if("age".equals(name)) {
  				        	user.setAge(Integer.parseInt(value==null? "20" : value));
  				        }
  				        if("sex".equals(name)) {
  				        	user.setSex(value);
  				        }
  				        if("roleId".equals(name)) {
  				        	roleId=value;
  				        }
  				    } else {
  				        //处理的是文件域
  				    	String fieldName = item.getFieldName();
  				        String fileName = item.getName();
  				        String contentType = item.getContentType();
  				        boolean isInMemory = item.isInMemory();
  				        long sizeInBytes = item.getSize();
  				        System.out.println("文件域-->"+fieldName+
  				                           "      "+fileName+
  				                           "      "+contentType+
  				                           "      "+isInMemory+
  				                           "      "+sizeInBytes);
  				        //解决fileName中带有路径问题
  				        if(fileName!=null) {
  				        	fileName=FilenameUtils.getName(fileName);
  				        }
  				        
  				        if(CommonValue.contentTypes.contains(contentType)) {
  				        	if(sizeInBytes<4194304) {
  				        		//上传的文件类型在指定文件类型范围内	
  					        	//获取服务器中的存储文件的路径
  						        //http://localhost:8080/up_down/upload
  						        String realPath=request.getSession().getServletContext().getRealPath("/head");
  						        System.out.println("realPath-->"+realPath);
  						        File file=new File(realPath);
  						        if(!file.exists()) {
  						        	file.mkdir();//upload文件夹不存在,则创建upload目录
  						        }
  						        //file是服务器存储文件的路径,fileName是文件名
  						        File uploadedFile = new File(file,fileName);
  						        item.write(uploadedFile);
  						        ResponseUtil.messageToClient(response, "上传成功!");
  						        user.setHead(fileName);//上传成功给user存储文件名称
  						        flag=true;
  				        	}else {
  				        		ResponseUtil.messageToClient(response, "文件太大!");
  				        		return;//文件上传失败,则不需要走数据库代码
  				        	}
  				            
  				        }else {
  				        	ResponseUtil.messageToClient(response, "文件类型不匹配!!");
  				        	return;//文件上传失败,则不需要走数据库代码
  				        }			        
  				    }
  				}
  			}else {
  				//说明没有上传文件,则图片的默认值为default.png
  				user.setHead("defualt.png"); 				
  			}
  		} catch (Exception e) {
  			// TODO Auto-generated catch block
  			e.printStackTrace();
  		}
		//上传文件结束
		
		//文件上传完后,才能给t_user表添加数据,以及给t_user_role添加数据,数据库操作开始
        if(flag) {
        	try {
				//说明文件上传成功,可以操作数据库了
				//且user对象的数据,都存储完毕(loginName,password,nickName,age,sex,head) 额外roleId
				//操作数据库有两个步骤,第一个给t_user表添加数据
				int rowAffect=userDao.addUser(user);
				
				//第二个给t_user_role表添加数据
				rowAffect+=userDao.addUserRole(user.getId(),roleId);
				if(rowAffect==2) {
					ResponseUtil.messageToClient(response, "添加用户成功");
				}
			} catch (Exception e) {
				//能执行到此处,一定是操作数据库的时候报异常了
				ResponseUtil.messageToClient(response, "添加用户失败!!");
				//应该删除之前已经上传完的文件
				String realPath=request.getSession().getServletContext().getRealPath("/head");
				File file=new File(realPath+File.separator+user.getHead());
				if(file.exists()) {
					file.delete();
				}
				e.printStackTrace();
			}       	
        }		
		//数据库操作结束
	}
    
}
